После завершения этого раздела вы сможете:
управлять правилами политики SELinux, которые определяют контекст по умолчанию для файлов и каталогов, с помощью команды semanage fcontext;
применять контекст, заданный политикой SELinux, к файлам и каталогам с помощью команды restorecon.
В системах, где работает SELinux, все процессы и файлы имеют метки. Метка представляет информацию, касающуюся безопасности, которая называется контекстом SELinux.
Новые файлы обычно наследуют контекст SELinux от родительского каталога, что гарантирует наличие надлежащего контекста.
Но эта процедура наследования может быть нарушена двумя способами. Во-первых, если вы создадите файл в одном каталоге, а затем переместите его в другой каталог, где предполагается его использовать, у файла по-прежнему будет контекст SELinux каталога, в котором он был создан, а не конечного каталога. Во-вторых, если вы скопируете файл с сохранением контекста SELinux, например с помощью команды cp -a, контекст SELinux будет отражать местоположение исходного файла.
В следующем примере демонстрируется наследование и связанные с ним проблемы. Рассмотрим два файла, созданные в каталоге /tmp, один из которых перемещен в каталог /var/www/html, а второй скопирован в тот же каталог. Обратите внимание на контекст SELinux для файлов. Для файла, который был перемещен в каталог /var/www/html, сохранился контекст каталога /tmp. Файл, который был скопирован в каталог /var/www/html, унаследовал контекст SELinux от каталога /var/www/html.
/tmp
/var/www/html
Команда ls -Z отображает контекст SELinux для файла. Обратите внимание на метку файла.
[root@host ~]# ls -Z /var/www/html/index.html -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
[root@host ~]#
ls -Z /var/www/html/index.html
httpd_sys_content_t
Команда ls -Zd отображает контекст SELinux для каталога.
[root@host ~]# ls -Zd /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
ls -Zd /var/www/html/
Обратите внимание, что у /var/www/html/index.html та же метка, что и у родительского каталога /var/www/html/. Теперь создайте файлы вне каталога /var/www/html и обратите внимание на их контекст.
/var/www/html/index.html
/var/www/html/
[root@host ~]# touch /tmp/file1 /tmp/file2 [root@host ~]# ls -Z /tmp/file* unconfined_u:object_r:user_tmp_t:s0 /tmp/file1 unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
touch /tmp/file1 /tmp/file2
ls -Z /tmp/file*
user_tmp_t
/tmp/file1
/tmp/file2
Переместите один из этих файлов в каталог /var/www/html, скопируйте второй и обратите внимание на метку каждого файла.
[root@host ~]# mv /tmp/file1 /var/www/html/ [root@host ~]# cp /tmp/file2 /var/www/html/
mv /tmp/file1 /var/www/html/
cp /tmp/file2 /var/www/html/
[root@host ~]# ls -Z /var/www/html/file* unconfined_u:object_r:user_tmp_t:s0 /var/www/html/file1 unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2
ls -Z /var/www/html/file*
/var/www/html/file1
/var/www/html/file2
Перемещенный файл сохраняет исходную метку, а скопированный файл наследует метку от каталога /var/www/html. unconfined_u: — это пользователь, object_r: ― это роль, а s0 — это уровень. Уровень чувствительности 0 — это минимально возможный уровень.
unconfined_u:
object_r:
s0
Изменить контекст SELinux для файлов можно с помощью команд semanage fcontext, restorecon и chcon.
Предпочтительный метод установки контекста SELinux для файла ― объявление метки по умолчанию с помощью команды semanage fcontext и последующее применение этого контекста к файлу с помощью команды restorecon. Это гарантирует наличие нужных меток даже после полной перерасстановки меток в файловой системе.
Команда chcon изменяет контекст SELinux. chcon устанавливает контекст безопасности для файла, хранящегося в файловой системе. Это полезно при проведении тестов и экспериментов. Однако при этом изменения контекста не сохраняются в базе данных контекста SELinux. При выполнении команды restorecon изменения, сделанные командой chcon, отменяются. Кроме того, при перерасстановке меток во всей файловой системе контекст SELinux, измененный с помощью команды chcon, будет восстановлен.
Далее показано создание каталога. Тип каталога ― default_t.
default_t
[root@host ~]# mkdir /virtual [root@host ~]# ls -Zd /virtual drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /virtual
mkdir /virtual
ls -Zd /virtual
Команда chcon изменяет контекст для каталога /virtual: значение типа изменяется на httpd_sys_content_t.
/virtual
[root@host ~]# chcon -t httpd_sys_content_t /virtual [root@host ~]# ls -Zd /virtual drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /virtual
chcon -t httpd_sys_content_t /virtual
Команда restorecon восстанавливает значение default_t для типа каталога. Обратите внимание на сообщение Relabeled.
Relabeled
[root@host ~]# restorecon -v /virtual Relabeled /virtual from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0 [root@host ~]# ls -Zd /virtual drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /virtual
restorecon -v /virtual
С помощью команды semanage fcontext можно отобразить и изменить правила, которые команда restorecon использует для установки контекста файлов по умолчанию. Путь и имена файлов указываются при помощи расширенных регулярных выражений. Чаще всего в правилах fcontext применяется регулярное выражение (/.*)?, которое означает «сопоставь с символом /, за которым следует любое число любых символов». Оно рекурсивно обрабатывает каталог, указанный перед выражением, и все элементы в этом каталоге.
fcontext
(/.*)?
Основные операции с контекстом файлов
В следующей таблице приведены опции команды semanage fcontext, позволяющие добавлять, удалять и отображать контекст SELinux для файлов.
Таблица 5.1. Опции команды semanage fcontext
Чтобы обеспечить наличие необходимых утилит для управления контекстом SELinux, установите пакеты policycoreutils и policycoreutils-python. Они содержат команды restorecon и semanage соответственно.
policycoreutils
policycoreutils-python
Чтобы убедиться, что все файлы в каталоге имеют правильный контекст, выполните команду semanage fcontext -l, а затем команду restorecon. В следующем примере обратите внимание на контекст каждого файла до и после выполнения команд semanage и restorecon.
[root@host ~]# semanage fcontext -l ...output omitted... /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ...output omitted...
semanage fcontext -l
[root@host; ~]# restorecon -Rv /var/www/ Relabeled /var/www/html/file1 from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 [root@host ~]# ls -Z /var/www/html/file* unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1 unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2
[root@host; ~]#
restorecon -Rv /var/www/
file1
file2
В следующем примере показано, как с помощью команды semanage добавить контекст для нового каталога.
[root@host ~]# mkdir /virtual [root@host ~]# touch /virtual/index.html [root@host ~]# ls -Zd /virtual/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /virtual/
touch /virtual/index.html
ls -Zd /virtual/
[root@host ~]# ls -Z /virtual/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html [root@host ~]# semanage fcontext -a -t httpd_sys_content_t '/virtual(/.*)?' [root@host ~]# restorecon -RFvv /virtual [root@host ~]# ls -Zd /virtual/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /virtual/ [root@host ~]# ls -Z /virtual/ -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
ls -Z /virtual/
semanage fcontext -a -t httpd_sys_content_t '/virtual(/.*)?'
restorecon -RFvv /virtual
Man-страницы chcon(1), restorecon(8), semanage(8) и semanage-fcontext(8)